#include <algorithm/analytical_model/io/json/converter/shared/utils/Rotation.h>
#include <algorithm/analytical_model/io/json/converter/shared/utils/Vec3.h>
#include <utils/HasValue.h>

using namespace solar;

void solar::tag_invoke(const boost::json::value_from_tag& /*unused*/,
                       boost::json::value& json_value, const Rotation& rotation)
{
    auto axis = SOLAR_GET_VALUE(Rotation, axis_, rotation);
    auto angle = SOLAR_GET_VALUE(Rotation, angle_, rotation);
    json_value = {
        { "axis", boost::json::value_from(axis)},
        {"angle",                         angle}
    };
}
auto solar::tag_invoke(const boost::json::value_to_tag<Rotation>& /*unused*/,
                       const boost::json::value& json_value) -> Rotation
{
    const auto* value_ptr = json_value.if_object();
    if (value_ptr == nullptr)
    {
        return {};
    }
    Rotation result;
    if (const auto* axis_value = value_ptr->if_contains("axis"); axis_value != nullptr)
    {
        SOLAR_SET_VALUE(Rotation, axis_, boost::json::value_to<Vec3>(*axis_value), result)
    }
    if (const auto* angle_value = value_ptr->if_contains("angle"); angle_value != nullptr)
    {
        SOLAR_SET_VALUE(Rotation, angle_, angle_value->to_number<double>(), result)
    }
    return result;
}
